perm filename PAGES.SAI[PUB,SYS] blob sn#195740 filedate 1979-09-02 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00014 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	BEGOF("PAGES")
C00007 00003	PUBLIC SIMPLE PROCEDURE PAGES! $"#
C00008 00004	PUBLIC SIMPLE PROCEDURE FINIPAGES $"#
C00009 00005	PUBLIC RECURSIVE PROCEDURE DBLANKPAGE $"#
C00010 00006	PUBLIC RECURSIVE PROCEDURE DFRAME(BOOLEAN BOXFRM) $"#
C00012 00007	PUBLIC PROCEDURE FINPAGE $"#
C00021 00008	PUBLIC SIMPLE PROCEDURE FIXFRAME(INTEGER FRIDA) $"#
C00022 00009	PUBLIC SIMPLE PROCEDURE GROWOWLS(INTEGER EXTRA) $"#
C00023 00010	PUBLIC SIMPLE PROCEDURE MAKEPAGE(INTEGER HIGH, WIDE) $"#
C00024 00011	PUBLIC SIMPLE PROCEDURE NEXTPAGE $"#
C00025 00012	PUBLIC SIMPLE PROCEDURE OPENFRAME $"#
C00026 00013	PUBLIC SIMPLE PROCEDURE OPENPAGE $"#
C00027 00014	FINISHED
C00028 ENDMK
C⊗;
BEGOF("PAGES")

COMMENT

All the output lines tentatively placed in the current frame are
stored in intermediate files and referenced by sequential number from
the integer array OWLS (OWtput LineS).  Its length is sufficient to
hold every line of every column of every area in it.  The general
form of a string referenced from OWLS is:

	<chars><cr><chars><cr>...<lf>

One of the <chars> (the last) may be a line that needs to be
justified in Pass Two.  Each word break in such a substring is
represented by a ALTMODE -- these mark the places that extra spaces
may be added.  Pass Two also needs to know about FONT changes -- in
the present version, this is limited to underlining, superscripts,
and subscripts.  A FONT change is signalled by the character pair
'177 <code>.  Finally, Pass Two will fill in forward references
marked '13 (vertical tab).

Other information must be known about each string in OWLS.  There
must be an indication of how many spaces to add to a justify-line
during Pass Two, and there must be mobility restrictions to assure
that groups stay together and that section titles stay at tops of
pages. This information is kept in integer arrays SHORT and MOLES
(MObility of LinES) of the same size as OWLS.  MOLES[J] is the
descriptor for OWLS[J].  To access these entries, the value J is
stored in an "area array" associated with the area the line was
placed in, at element [C,L] for the C'th column and L'th line.

A Moles descriptor looks like this:

 --------------------------------------------------
|       |        |L|H|L|R|A|B|              |      |
|       |        |O|O|E|I|B|E|              |      |
|UN-USED|  FOOT  |C|R|F|G|O|L|    LABEL     | LEAD |
|       |        |K|I|T|H|V|O|              |      |
|       |        | |Z| |T|E|W|              |      |
 --------------------------------------------------
 0.....6 7.....11-2-3-4-5-6-7-18..........31 32..35

Another array parallel to SHORT and MOLES is MLEAD.  When an entry is
zero, it means that the mill leading above the line is the normal
value MILLVERTI (initiallized in OWLPLACE inside PASTE).  A nonzero
value is added to MILLVERTI in pass 2 to compute the unusual mill
leading of the line.

;

PROCEDURES
PUBLIC SIMPLE PROCEDURE PAGES! ;$"#
BEGIN "PAGES!"
OLX ← -1 ; OLMAX ← 5 ;
OWLSEQ ← MESGS ← 0 ;
END "PAGES!" ;
PUBLIC SIMPLE PROCEDURE FINIPAGES ;$"#
BEGIN "FINIPAGES"
COMMENT Finish Last Page File ;
IF INTER GEQ 0 THEN
	BEGIN
	FOR DUMMY←1 THRU 5 DO WORDOUT(INTER,-20) ;
	RELEASE(INTER) ;
	RELEASE(SINTER) ;
	END ;
END "FINIPAGES" ;
PUBLIC RECURSIVE PROCEDURE DBLANKPAGE ;$"#
BEGIN COMMENT LEAVE N BLANK PAGES WITHOUT AFFECTING THE PAGE NUMBER ;
INTEGER I, J, N ;
PASS ; N ← CVD(E("1", NULL)) ;
IF  NOT ON THEN RETURN ;
DBREAK ;
IF OLDPGIDA THEN NEXTPAGE ;
IF INTER LEQ 0 THEN NOPORTION ;
FOR I ← 1 THRU N DO
	FOR J ← PHIGH, PWIDE, EVENLEFTBORDER, ODDLEFTBORDER, -10 DO
		WORDOUT(INTER, J) ;
END ;
PUBLIC RECURSIVE PROCEDURE DFRAME(BOOLEAN BOXFRM) ;$"#
BEGIN
INTEGER L, I ;
PRELOAD!WITH "HIGH", "WIDE" ; OWN STRING ARRAY POST[1:2];
STRING ARRAY PAR[1:2] ;
DAPART ; PASS ; PARAMS(2,NULLS,PAR,POST);
IF ON THEN
IF BOXFRM THEN BEGIN END
ELSE
BEGIN
PHIGH←FHIGH←IF NULSTR(PAR[1]) THEN 1 ELSE CVD(PAR[1]) ;
PWIDE←FWIDE←IF NULSTR(PAR[2]) THEN 1 ELSE CVD(PAR[2]) ;
IF OLDPGIDA THEN NEXTPAGE ;
L ← NULLAREAS ;
WHILE L DO	BEGIN
		I ← AREAIDA ; IDASSIGN(AREAIDA←L,THISAREA) ; L ← RH(INA) ;
		OPEN!ACTIVE(DEFA) ← 0 ; GOAWAY(AREAIDA) ; IF (AREAIDA←I) THEN IDASSIGN(AREAIDA,THISAREA) ;
		END ;
NULLAREAS ← 0 ;
END ;
END "DFRAME" ;
PUBLIC PROCEDURE FINPAGE ;$"#
BEGIN "FINPAGE" COMMENT ***T EMPO RA RY  V ERS I ON -- No Boxes **** ;
INTEGER A, CS, LS, C, L, X, LB, LBPAGE, LINK, LINENO, FOOTLINE1, F, OWLINE, ARIX ;
INTEGER NULINE, NUPINE, NUINE, NLFOOT, NPFOOT, NFOOT, NAREA ; 
IF EXNEXTPAGE THEN BEGIN WARN("=","Response to PAGE change called NEXT PAGE again.") ; RETURN END ;
EXNEXTPAGE ← TRUE ;
BEGIN "PAGEOUT"
COMMENT PASS 1 OUTPUT FORMAT FOR EACH PAGE :
	Height Width MillLeftMargin MillRightMargin
	For each area:
		UpperLine NumCols NumLines
		For each column:
			LeftChar
			For each non-null line:
				LineNo
				How far short of being justified
				Excess mill leading
				Index of Intermediate Ascii File line
			0
	-10
	;
IF OLDPGIDA NEQ FRAMEIDA THEN BEGIN WARN("=","FRAME NEQ PAGE at end of page"); FIXFRAME(OLDPGIDA) END ;
IF AREAIDA AND AREAIXM AND STATUS=1 THEN CLOSEAREA(AREAIXM, FALSE) ;
IF (A ← ARF) THEN
BEGIN "NONEMPTY"
INTEGER ARRAY XTRALINES[1:HIGHF]; RKJ TO FIXUP "TOPLINES" OF AREAS;
IF INTER LEQ 0 THEN NOPORTION ;
LS←0;
WHILE A DO BEGIN "COLLECTXGENS"
	IDASSIGN(AREAIDA←A, THISAREA) ; A ← ARA ; IDASSIGN(AAA, AA) ;
	IF STATA THEN LS ← LS + (XTRALINES[ULLA MAX 1] ← XGENA);
	END "COLLECTXGENS";
A←ARF;
WORDOUT(INTER, HIGHF+LS) ; WORDOUT(INTER, WIDEF) ;
L ← ODDLEFTBORDER ; F ← EVENLEFTBORDER ;
IF NULSTR(S←CTR!VAL(PATPAGE)) OR CVD(S) MOD 2 THEN F SWAP L ;
WORDOUT(INTER, F) ; WORDOUT(INTER, L) ; TES 8/29/74;
WHILE A DO BEGIN "AFTER AREA RESPONSES"
	IDASSIGN(AREAIDA←A, THISAREA) ; A ← ARA ; IDASSIGN(AAA, AA) ;
	IF (X ← DEFA) AND STATA=1 AND FINDTRAN(LDB(BIXNUM(X)), 3) THEN RESPOND(LLTHIS) ;
	END "AFTER AREA RESPONSES" ;
A ← ARF ;
WHILE A DO BEGIN "CLOSE ALL AREAS"
	IDASSIGN(AREAIDA←A, THISAREA) ; A ← ARA ; IDASSIGN(AAA, AA) ;
	IF STATA = 1 THEN CLOSEAREA(-DEFA, FALSE) ;
	END "CLOSE ALL AREAS" ;
A ← ARF ;
WHILE A DO
	BEGIN "AREAOUT"
	IDASSIGN(AREAIDA←A, THISAREA) ; NAREA ← 0 ; IDASSIGN(AAA, AA) ;
	IF STATA > 1 THEN
		BEGIN "AREAUSED" TES CHANGED X TO ARIX 12/5/73 ;
		IF GRPOLX AND (STATUS←STATA)=2 AND (ARIX ← DEFA) THEN
			BEGIN COMMENT SET UP GROUP OVERFLOW INFO ;
			FIXFRAME(NEWPGIDA) ; OPENAREA(ARIX) ; NAREA ← AREAIDA ;
			IDASSIGN(AAA, NAA) ; NLFOOT←NPFOOT←NULINE←NUPINE←0 ;
			FIXFRAME(OLDPGIDA) ; IDASSIGN(AREAIDA←A, THISAREA) ;
			IDASSIGN(AAA, AA) ;
			END ;
		CS ← COLCA ;
		LS ← ARRINFO(AA, 4) ; TES 11/6/74;
		F←0; RKJ;
		FOR C←1 THRU ULLA-1 DO F←F+XTRALINES[C];
			RKJ SEE IF ANY AREAS ABOVE THIS ONE HAVE "XTRALINES";
		WORDOUT(INTER, ULLA+F) ; RKJ ADDED F;
		WORDOUT(INTER, CS) ; WORDOUT(INTER, LS) ;
		FOR C ← 1 THRU CS DO
			BEGIN "AREACOL"
			WORDOUT(INTER, AA[C,0]) ;
			FOOTLINE1 ← LINECA+XGENA - RH(AA[CS+C,0]) ; TES 11/6/74 ;
			FOR F ← 0, CS DO FOR L ← 1 THRU LS DO IF (X ← AA[F+C, L]) THEN
			IF GRPOLX = 0 OR X < GRPOLX OR X > GRPTOP THEN
				BEGIN "AREALINE" LINENO ← IF F=0 THEN L ELSE FOOTLINE1 + L ;
				IF (LB ← LDB(LABELM(X))) THEN
					BEGIN "A PAGE LABEL"
					LBPAGE ← 2 ROT -2 LOR PUTS(PAGEVAL&
					   (IF XCRIBL THEN ALTMODE&CVS(XLENGTH(PAGEVAL)) ELSE NULL)) ;
					WHILE LB NEQ -TWO(13) DO
					IF (LINK ← LB) < 0 THEN
						BEGIN
						LB←NUMBER[-LINK] ;
						NUMBER[-LINK] ← LBPAGE ;
						END
					ELSE BEGIN LB←ITBL[LINK] ; ITBL[LINK]←LBPAGE END ;
					END "A PAGE LABEL" ;
				IF OWLINE ← OWLS[X] THEN
					BEGIN
					WORDOUT(INTER, LINENO) ;
					WORDOUT(INTER, SHORT[X]) ;
					WORDOUT(INTER, MLEAD[X]) ;
					WORDOUT(INTER, OWLINE) ;
					END ;
				END "AREALINE"
			ELSE	BEGIN "GRP OVERFLOW"
				IF F AND NUPINE=0 AND GRPOLX>AA[F+C,1] THEN TES 11/5,12/11/73 ;
				 BEGIN "FOOTSP"
				 FOR NUPINE←1 THRU FTGP DO
				 	NAA[F+1,NUPINE] ←
					TES 1/16/74 NEWNEW: ;
				 	NEWNEWBLANK(IF NUPINE=1 THEN BLW ELSE ABV!BLW) ;
				 NAA[F+1,NUPINE]←NOLX←NOLX+1 ;
				 NOWLS[NOLX] ← OWLSEQ ← OWLSEQ+1 ;
				IF XCRIBL THEN
				OUT(SINTER,CVSR(OWLSEQ)&ALTMODE&
				   PICKFONT(FSFONT)&ENOUGH(FOOTSEP,COLWID(AREAIXM),FSFONT)&CRLF)
				ELSE
				 OUT(SINTER, CVSR(OWLSEQ) & ALTMODE &
				 	FOOTSEP[1 TO COLWID(ARIX)] & CRLF) ;
				 NMOLES[NOLX] ← IF FTGP=0 THEN BLW ELSE ABV!BLW ;
				 FOR LB←NUPINE+1 THRU NUPINE+FTGP2 DO
				 	NAA[F+1,LB] ← NEWNEWBLANK(ABV!BLW) ;
				 NUPINE ← NUPINE + FTGP2 ;
				 END "FOOTSP" ;
				NUINE ← IF F THEN NUPINE ← NUPINE + 1 ELSE NULINE ← NULINE + 1 ;
				NFOOT ← IF LDB(FOOTM(X)) = 0 THEN 0
					ELSE IF F THEN NPFOOT←NPFOOT+1 ELSE NLFOOT←NLFOOT+1 ;
				NAA[F+1, NUINE] ← NOLX ← NOLX + 1 ;  NOWLS[NOLX] ← OWLS[X] ;
				IF NFOOT THEN DPB(NFOOT, FOOTM(X)) ;
				NMOLES[NOLX] ← MOLES[X] ;
				NSHORT[NOLX] ← SHORT[X] ;
				NMLEAD[NOLX] ← MLEAD[X] ;
				END "GRP OVERFLOW" ;
			WORDOUT(INTER, 0) ;
			END "AREACOL" ;
		END "AREAUSED" ;
	A ← ARA ;
	GOAWAY(WHATIS(AA)) ; GOAWAY(AREAIDA) ;
	IF NAREA THEN
		BEGIN
		NAA[1, 0] ← NULINE ; NAA[CS+1, 0] ← NUPINE ;
		IDASSIGN(AREAIDA←NAREA, THISAREA) ; COLA ← 1 ; AREAIDA ← 0 ;
		END ;
	END "AREAOUT" ;
WORDOUT(INTER, -10) ;
END "NONEMPTY" ;
GOAWAY(MOLESIDA) ; GOAWAY(SHORTIDA) ; GOAWAY(MLEADIDA) ;
GOAWAY(-1 LSH 18 + OWLSIDA) ;
MOLESIDA ← MLEADIDA ← SHORTIDA ← OWLSIDA ← GROUPM ← GLINEM ← 0 ;
GOAWAY(FRAMEIDA) ; FRAMEIDA ← OLDPGIDA ← AREAIDA ← 0 ; STATUS ← -1 ;
END "PAGEOUT" ;
IF GRPOLX THEN GRPOLX ← 0 ;
EXNEXTPAGE ← FALSE ;
OVEREST ← 0; comment short font kludge ;
END "FINPAGE" ;
PUBLIC SIMPLE PROCEDURE FIXFRAME(INTEGER FRIDA) ;$"#
BEGIN "FIXFRAME"
IF AREAIDA AND STATUS=1 THEN PLACE(AREAIXM) ; COMMENT BE SURE LINE,PINE STORED IN AA ;
IF MOLESIDA THEN MOLES[0] ← OLX ; TES 1/15/74 ADDED IF.. ;
IDASSIGN(FRAMEIDA ← FRIDA, THISFRAME) ;
IDASSIGN(OWLSIDA ← OWLSF, OWLS) ;
IDASSIGN(MOLESIDA ← MOLESF, MOLES) ;
IDASSIGN(SHORTIDA ← SHORTF, SHORT) ;
IDASSIGN(MLEADIDA ← MLEADF, MLEAD) ;
OLX ← MOLES[0] ; AREAIDA ← 0 ;
END "FIXFRAME" ;
PUBLIC SIMPLE PROCEDURE GROWOWLS(INTEGER EXTRA) ;$"#
BEGIN "GROWOWLS"
GROW(MOLES, MOLESIDA, OLXX, EXTRA, NULL) ; MAKEBE(MOLESIDA, MOLES) ;
GROW(SHORT, SHORTIDA, DUMMY←0, EXTRA, NULL) ; MAKEBE(SHORTIDA, SHORT) ;
GROW(MLEAD, MLEADIDA, DUMMY←0, EXTRA, NULL) ; MAKEBE(MLEADIDA, MLEAD) ;
DUMMY ← 0 ; COMMENT OTHERWISE SPURIOUS MESSAGE FROM GROW 2/28/73 TES ;
GROW(OWLS, OWLSIDA, DUMMY, EXTRA, NULL) ;
MAKEBE(OWLSIDA, OWLS) ;
OWLSF ← OWLSIDA ; MOLESF ← MOLESIDA ; SHORTF ← SHORTIDA ; MLEADF ← MLEADIDA ;
END "GROWOWLS" ;
PUBLIC SIMPLE PROCEDURE MAKEPAGE(INTEGER HIGH, WIDE) ;$"#
BEGIN "MAKEPAGE"
IDASSIGN(FRAMEIDA←CREATE(0,PFREC), THISFRAME) ;
HIGHF ← HIGH; WIDEF ← WIDE;
END "MAKEPAGE" ;
PUBLIC SIMPLE PROCEDURE NEXTPAGE ;$"#
	BEGIN
	INTEGER SAVEAREA ;
	SAVEAREA ← IF AREAIXM THEN LDB(BIXNUM(AREAIXM)) ELSE SYMTEXT ;
	NEXTCOUNTER(SYMPAGE, IXPAGE) ;
	PLACE(LDB(IXN(SAVEAREA))) ;
	END ;
PUBLIC SIMPLE PROCEDURE OPENFRAME ;$"#
BEGIN "OPENFRAME"
MAKEPAGE(FHIGH,FWIDE);
OLXX ← OLMAX ; comment Total of all areas now declared ; OLX ← 0 ;
IDASSIGN(OWLSF←OWLSIDA←CREATE(0,OLXX), OWLS);
IDASSIGN(MOLESF←MOLESIDA←CREATE(0,OLXX), MOLES);
IDASSIGN(SHORTF←SHORTIDA←CREATE(0,OLXX), SHORT);
IDASSIGN(MLEADF←MLEADIDA←CREATE(0,OLXX), MLEAD);
END "OPENFRAME" ;
PUBLIC SIMPLE PROCEDURE OPENPAGE ;$"#
     DO	BEGIN OPENFRAME ; IDASSIGN(OLDPGIDA ← FRAMEIDA, OLDPAGE) ;
	PAGEVAL ← PATT!VAL(PATPAGE) ;
	IF FINDTRAN(SYMPAGE, 4) THEN RESPOND(LLTHIS) ;
	END UNTIL FRAMEIDA ;
FINISHED

ENDOF("PAGES")